C语言学习记录:union(联合)、enum(枚举)、typedef |
您所在的位置:网站首页 › typedef union{long} › C语言学习记录:union(联合)、enum(枚举)、typedef |
本篇文章为 C primer plus 中文版(第六版) 14章阅读笔记 目录 union(联合) 联合定义变量 初始化联合 使用联合 枚举类型 (enumerated type) 枚举声明 枚举符的值 枚举使用 typedef 为某一类型自定义名称 指针问题、结构问题 union(联合)union 是一种数据类型,能在同一个内存空间中存储不同的数据类型(不是同时储存)。 其典型用法:设计一种表以存储既无规律、事先也不知道顺序的混合类型。 使用联合类型的数组,其中的联合都大小相等,每个联合可以存储各种数据类型。 创建一个带标记的联合模板: union hold{ int digit; double bigfl; char letter; }和结构体不同!联合只能存储一个 int 或者 double 或者 char ! 联合定义变量 union hold fit; union hold save[10]; union hold * pu;说明: 第一个声明创建了一个单独的联合变量 fit 。编译器分配足够的空间以便它能存储联合声明中占用最大字节的类型。第二个声明创建了一个数组,内含 10 个元素,每个元素大小参照第一个声明的说明。第三个声明创建了一个指针 初始化联合 union hold valA; valA.letter = ‘R’; union hold valB = valA; // 用另一个联合来初始化 union hold valC = {88}; // 初始化联合的 digit 成员 unipn hold valD = {.bigfl = 118.2}; // 指定初始化器说明: union hold valC = {88} 这种没有指定初始化元素的默认初始化为联合的第一个元素。 使用联合 union hold{ int digit; double bigfl; char letter; } union hold fit; fit.digit = 23; fit.bigfl = 2.0; fit.letter = 'h';当使用指针: union hold * pu; pu = &fit; x = pu->digit;错误示例: fit.letter = 'A'; flnum = 3.02 * fit.bigfl; //错误fit 中存储的是 char 类型,读的时候却要读 double 类型,这不太行。 用联合定义结构体联合变量,可方便使用数据模板!(此处不赘述,用时再说,还是说吧) 租车问题,如果汽车没出租,用一个成员描述拥有者。如果汽车被出租,用一个成员描述租车公司 struct owner //拥有者 { char socsecurity[12]; //.................. }; struct leasecompany //租赁公司 { char name[40]; char headquarters[40]; //.................. }; union data { struct owner owncar; struct leasecompany leasecar; } struct car_data { char make[15]; int status; //表示租车状态,私有为0,租赁为1 union data ownerinfo; //.................. } struct car_data flits;如果 flits.status 为0,程序使用 flits.ownerinfo.owncar.socsecurity 。 如果 flits.status 为1,则程序使用 flits.ownerinfo.leasecar.name 。 匿名联合和结构是差不多的。 struct owner //拥有者 { char socsecurity[12]; //.................. }; struct leasecompany //租赁公司 { char name[40]; char headquarters[40]; //.................. }; struct car_data { char make[15]; int status; //表示租车状态,私有为0,租赁为1 union { struct owner owncar; struct leasecompany leasecar; } //.................. } struct car_data flits;可用 flits.owncar.socsecurity 代替 flits.ownerinfo.owncar.socsecurity 。 枚举类型 (enumerated type)使用枚举类型声明符号名称来表示整形常量。 提高程序的可读性,语法与结构的语法相同。 枚举声明 enum spectrum {red,orange,yellow,green,blue,violet}; enum spectrum color;第一行创建了 spectrum 作为标记名,允许把 enum spetrum 作为一个类型名使用。花括号内的标识符枚举了 spectrum 变量可能有的值。称为枚举符(enumerator)。 第二行声明了 color 作为该类型的变量。color 的值可能是 red、orange、yellow.... 。 枚举符的值 enum spectrum {red,orange,yellow,green,blue,violet};这些标识符都是有名称的常量。 默认情况下 red = 0,orange = 1,violet = 5 。 可以为枚举常量设定指定值! enum spectrum {red = 10,orange = 100,yellow = 1000};或者: enum spectrum {red,orange = 100,yellow};此时,red = 0,orange = 100,yellow = 101 。 枚举使用枚举常量可以直接当做 int 使用! 以下示例方法,都是可以使用的! color ++ ; printf("red = %d\n",red); switch(color) { case red: return; } if(color == yellow) { } typedef 为某一类型自定义名称与 #define 不同, typedef 创建的符号名只受限于类型,不能用于值。 typedef unsigned char u_char; 指针问题、结构问题真的什么都绕不过指针 typedef char * STRING; STRING name,sign; //相当于 char * name, * sign; //如果 #defin STRING char * STRING name,sign; //相当于 char * name, sign; //导致只有name被定义成指针定义结构 typedef struct complex { float real; float imag; }COMPLEX;就可以用 COMPLEX 类型代替 complex 结构。 还可以省略该结构的标签 typedef struct { float real; float imag; }COMPLEX;typedef还用来声明复杂函数! OK ~ 就到这吧! |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |